home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / patches / dungeon.lha / Dungeon / Source.lha / np.c < prev    next >
C/C++ Source or Header  |  1995-10-14  |  5KB  |  291 lines

  1. /* RDLINE-    READ INPUT LINE */
  2.  
  3. /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
  4. /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
  5. /* WRITTEN BY R. M. SUPNIK */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include "funcs.h"
  10. #include "vars.h"
  11.  
  12. /* This declaration is here since many systems don't have <stdlib.h> */
  13.  
  14. extern int system P((const char *));
  15.  
  16. static logical lex_ P((char *, integer *, integer *, logical));
  17.  
  18. void rdline_(buffer, who)
  19. char *buffer;
  20. integer who;
  21. {
  22.     /* Local variables */
  23.     char *z, *zlast;
  24.  
  25.     /* Function Body */
  26. L5:
  27.     switch (who + 1) {
  28.     case 1:  goto L90;
  29.     case 2:  goto L10;
  30.     }
  31. /*                         !SEE WHO TO PROMPT FOR. */
  32. L10:
  33.     printf(">");
  34. /*                         !PROMPT FOR GAME. */
  35. L90:
  36.     AmigaGetString(buffer, 78);
  37.     more_input();
  38.  
  39.     if (buffer[0] == '!') {
  40.     system(buffer + 1);
  41.     goto L5;
  42.     }
  43.  
  44.     zlast = buffer - 1;
  45.     for (z = buffer; *z != '\0' && *z != '\n'; z++) {
  46.     if (*z != ' ')
  47.         zlast = z;
  48.     if (islower(*z))
  49.         *z = toupper(*z);
  50.     }
  51.     z = zlast + 1;
  52.     if (z == buffer)
  53.     goto L5;
  54.     *z = '\0';
  55.  
  56.     prsvec_1.prscon = 1;
  57. /*                         !RESTART LEX SCAN. */
  58. } /* rdline_ */
  59.  
  60. /* PARSE-    TOP LEVEL PARSE ROUTINE */
  61.  
  62. /* THIS ROUTINE DETAILS ON BIT 0 OF PRSFLG */
  63.  
  64. logical parse_(inbuf, vbflag)
  65. char *inbuf;
  66. logical vbflag;
  67. {
  68.     /* System generated locals */
  69.     integer i__1;
  70.     logical ret_val;
  71.  
  72.     /* Local variables */
  73.     integer outbuf[40], outlnt;
  74.  
  75.     /* Parameter adjustments */
  76.     --inbuf;
  77.  
  78.     /* Function Body */
  79.     ret_val = FALSE_;
  80. /*                         !ASSUME FAILS. */
  81.     prsvec_1.prsa = 0;
  82. /*                         !ZERO OUTPUTS. */
  83.     prsvec_1.prsi = 0;
  84.     prsvec_1.prso = 0;
  85.  
  86.     if (! lex_(inbuf + 1, outbuf, &outlnt, vbflag)) {
  87.     goto L100;
  88.     }
  89.     if ((i__1 = sparse_(outbuf, outlnt, vbflag)) < 0) {
  90.     goto L100;
  91.     } else if (i__1 == 0) {
  92.     goto L200;
  93.     } else {
  94.     goto L300;
  95.     }
  96. /*                         !DO SYN SCAN. */
  97.  
  98. /* PARSE REQUIRES VALIDATION */
  99.  
  100. L200:
  101.     if (! (vbflag)) {
  102.     goto L350;
  103.     }
  104. /*                         !ECHO MODE, FORCE FAIL. */
  105.     if (! synmch_()) {
  106.     goto L100;
  107.     }
  108. /*                         !DO SYN MATCH. */
  109.     if (prsvec_1.prso > 0 & prsvec_1.prso < xsrch_1.xmin) {
  110.     last_1.lastit = prsvec_1.prso;
  111.     }
  112.  
  113. /* SUCCESSFUL PARSE OR SUCCESSFUL VALIDATION */
  114.  
  115. L300:
  116.     ret_val = TRUE_;
  117. L350:
  118.     orphan_(0, 0, 0, 0, 0);
  119. /*                         !CLEAR ORPHANS. */
  120.     return ret_val;
  121.  
  122. /* PARSE FAILS, DISALLOW CONTINUATION */
  123.  
  124. L100:
  125.     prsvec_1.prscon = 1;
  126.     return ret_val;
  127.  
  128. } /* parse_ */
  129.  
  130. /* ORPHAN- SET UP NEW ORPHANS */
  131.  
  132. /* DECLARATIONS */
  133.  
  134. void orphan_(o1, o2, o3, o4, o5)
  135. integer o1;
  136. integer o2;
  137. integer o3;
  138. integer o4;
  139. integer o5;
  140. {
  141.     orphs_1.oflag = o1;
  142. /*                         !SET UP NEW ORPHANS. */
  143.     orphs_1.oact = o2;
  144.     orphs_1.oslot = o3;
  145.     orphs_1.oprep = o4;
  146.     orphs_1.oname = o5;
  147. } /* orphan_ */
  148.  
  149. /* LEX-    LEXICAL ANALYZER */
  150.  
  151. /* THIS ROUTINE DETAILS ON BIT 1 OF PRSFLAG */
  152.  
  153. static logical lex_(inbuf, outbuf, op, vbflag)
  154. char *inbuf;
  155. integer *outbuf;
  156. integer *op;
  157. logical vbflag;
  158. {
  159.     /* Initialized data */
  160.  
  161.     static const char dlimit[9] = { 'A', 'Z', 'A' - 1,
  162.                     '1', '9', '1' - 31,
  163.                     '-', '-', '-' - 27 };
  164.  
  165.     /* System generated locals */
  166.     logical ret_val;
  167.  
  168.     /* Local variables */
  169.     integer i;
  170.     char j;
  171.     integer k, j1, j2, cp;
  172.  
  173.     /* Parameter adjustments */
  174.     --outbuf;
  175.     --inbuf;
  176.  
  177.     /* Function Body */
  178.  
  179.     for (i = 1; i <= 40; ++i) {
  180. /*                         !CLEAR OUTPUT BUF. */
  181.     outbuf[i] = 0;
  182. /* L100: */
  183.     }
  184.  
  185.     ret_val = FALSE_;
  186. /*                         !ASSUME LEX FAILS. */
  187.     *op = -1;
  188. /*                         !OUTPUT PTR. */
  189. L50:
  190.     *op += 2;
  191. /*                         !ADV OUTPUT PTR. */
  192.     cp = 0;
  193. /*                         !CHAR PTR=0. */
  194.  
  195. L200:
  196.     j = inbuf[prsvec_1.prscon];
  197. /*                         !GET CHARACTER */
  198.  
  199.     if (j == '\0')
  200.     goto L1000;
  201. /*                         !END OF INPUT? */
  202.  
  203.     ++prsvec_1.prscon;
  204. /*                         !ADVANCE PTR. */
  205.  
  206.     if (j == '.') {
  207.     goto L1000;
  208.     }
  209. /*                         !END OF COMMAND? */
  210.     if (j == ',') {
  211.     goto L1000;
  212.     }
  213. /*                         !END OF COMMAND? */
  214.     if (j == ' ') {
  215.     goto L6000;
  216.     }
  217. /*                         !SPACE? */
  218.     for (i = 1; i <= 9; i += 3) {
  219. /*                         !SCH FOR CHAR. */
  220.     if (j >= dlimit[i - 1] & j <= dlimit[i]) {
  221.         goto L4000;
  222.     }
  223. /* L500: */
  224.     }
  225.  
  226.     if (vbflag) {
  227.     rspeak_(601);
  228.     }
  229. /*                         !GREEK TO ME, FAIL. */
  230.     return ret_val;
  231.  
  232. /* END OF INPUT, SEE IF PARTIAL WORD AVAILABLE. */
  233.  
  234. L1000:
  235.     if (inbuf[prsvec_1.prscon] == '\0') {
  236.     prsvec_1.prscon = 1;
  237.     }
  238. /*                         !FORCE PARSE RESTART. */
  239.     if (cp == 0 & *op == 1) {
  240.     return ret_val;
  241.     }
  242.     if (cp == 0) {
  243.     *op += -2;
  244.     }
  245. /*                         !ANY LAST WORD? */
  246.     ret_val = TRUE_;
  247.     return ret_val;
  248.  
  249. /* LEGITIMATE CHARACTERS: LETTER, DIGIT, OR HYPHEN. */
  250.  
  251. L4000:
  252.     j1 = j - dlimit[i + 1];
  253.     if (cp >= 6) {
  254.     goto L200;
  255.     }
  256. /*                         !IGNORE IF TOO MANY CHAR. */
  257.     k = *op + cp / 3;
  258. /*                         !COMPUTE WORD INDEX. */
  259.     switch (cp % 3 + 1) {
  260.     case 1:  goto L4100;
  261.     case 2:  goto L4200;
  262.     case 3:  goto L4300;
  263.     }
  264. /*                         !BRANCH ON CHAR. */
  265. L4100:
  266.     j2 = j1 * 780;
  267. /*                         !CHAR 1... *780 */
  268.     outbuf[k] = outbuf[k] + j2 + j2;
  269. /*                         !*1560 (40 ADDED BELOW). */
  270. L4200:
  271.     outbuf[k] += j1 * 39;
  272. /*                         !*39 (1 ADDED BELOW). */
  273. L4300:
  274.     outbuf[k] += j1;
  275. /*                         !*1. */
  276.     ++cp;
  277.     goto L200;
  278. /*                         !GET NEXT CHAR. */
  279.  
  280. /* SPACE */
  281.  
  282. L6000:
  283.     if (cp == 0) {
  284.     goto L200;
  285.     }
  286. /*                         !ANY WORD YET? */
  287.     goto L50;
  288. /*                         !YES, ADV OP. */
  289.  
  290. } /* lex_ */
  291.